home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -in_the_mag- / emulation / amiga / uae-0.7.0b2 / src / uaeexe.c < prev    next >
C/C++ Source or Header  |  1998-01-20  |  2KB  |  125 lines

  1. /*
  2.  *  uaeexe.c - UAE remote cli
  3.  *
  4.  *  (c) 1997 by Samuel Devulder
  5.  */
  6.  
  7. #include "sysconfig.h"
  8. #include "sysdeps.h"
  9.  
  10. #include "config.h"
  11. #include "options.h"
  12. #include "uae.h"
  13. #include "memory.h"
  14. #include "custom.h"
  15. #include "readcpu.h"
  16. #include "newcpu.h"
  17. #include "autoconf.h"
  18. #include "uaeexe.h"
  19.  
  20. static struct uae_xcmd *first = NULL;
  21. static struct uae_xcmd *last  = NULL;
  22. static char running = 0;
  23. static uae_u32 uaeexe_server(void);
  24.  
  25. /*
  26.  * Install the server
  27.  */
  28. void uaeexe_install(void)
  29. {
  30.     uaecptr loop;
  31.  
  32.     loop = here ();
  33.     org(UAEEXE_ORG);
  34.     calltrap (deftrap (uaeexe_server));
  35.     dw(RTS);
  36.     org(loop);
  37. }
  38.  
  39. /*
  40.  * Send command to the remote cli.
  41.  *
  42.  * To use this, just call uaeexe("command") and the command will be
  43.  * executed by the remote cli (provided you've started it in the
  44.  * s:user-startup for example). Be sure to add "run" if you want
  45.  * to launch the command asynchronously. Please note also that the
  46.  * remote cli works better if you've got the fifo-handler installed.
  47.  */
  48. int uaeexe(char *cmd)
  49. {
  50.     struct uae_xcmd *nw;
  51.  
  52.     if (!running)
  53.     goto NORUN;
  54.  
  55.     nw = (struct uae_xcmd *)malloc (sizeof *nw);
  56.     if (!nw)
  57.     goto NOMEM;
  58.     nw->cmd = (char *)malloc (strlen (cmd) + 1);
  59.     if (!nw->cmd) {
  60.     free (nw);
  61.     goto NOMEM;
  62.     }
  63.  
  64.     strcpy (nw->cmd, cmd);
  65.     nw->prev = last;
  66.     nw->next = NULL;
  67.  
  68.     if(!first) first  = nw;
  69.     if(last) {
  70.            last->next = nw;
  71.            last       = nw;
  72.     } else last       = nw;
  73.  
  74.     return UAEEXE_OK;
  75.   NOMEM:
  76.     return UAEEXE_NOMEM;
  77.   NORUN:
  78.     write_log("Remote cli is not running.\n");
  79.     return UAEEXE_NOTRUNNING;
  80. }
  81.  
  82. /*
  83.  * returns next command to be executed
  84.  */
  85. static char *get_cmd(void)
  86. {
  87.     struct uae_xcmd *cmd;
  88.     char *s;
  89.  
  90.     if(!first) return NULL;
  91.     s = first->cmd; 
  92.     cmd = first; first = first->next;
  93.     if(!first) last = NULL;
  94.     free(cmd);
  95.     return s;
  96. }
  97.  
  98. /*
  99.  * helper function
  100.  */
  101. #define ARG(x) (get_long (m68k_areg (regs, 7) + 4*(x+1)))
  102. static uae_u32 uaeexe_server(void)
  103. {
  104.     int len;
  105.     char *cmd;
  106.     char *dst;
  107.  
  108.     if(ARG(0) && !running) {
  109.         running = 1;
  110.         write_log("Remote CLI started.\n");
  111.     }
  112.  
  113.     cmd = get_cmd(); if(!cmd) return 0;
  114.     if(!ARG(0)) {running = 0;return 0;}
  115.  
  116.     dst = (char *)get_real_address(ARG(0));
  117.     len = ARG(1);
  118.     strncpy(dst,cmd,len);
  119.     printf("Sending '%s' to remote cli\n",cmd); /**/
  120.     free(cmd);
  121.     return ARG(0);
  122. }
  123.  
  124.  
  125.